package com.nowcoder.topic.pointers.middle;

/**
 * NC168 盛水最多的容器
 * @author d3y1
 */
public class NC168{
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param height int整型一维数组
     * @return int整型
     */
    public int maxArea (int[] height) {
        return solution1(height);
        // return solution2(height);
    }

    /**
     * 双指针(对撞指针) + 贪心
     * @param height
     * @return
     */
    private int solution1(int[] height){
        int n = height.length;
        if(n < 2){
            return 0;
        }

        int result = 0;
        int water;
        int lower;
        // 双指针(对撞指针)
        int i=0,j=n-1;
        while(i < j){
            lower = Math.min(height[i],height[j]);
            water = lower*(j-i);
            result = Math.max(result, water);
            // 贪心
            if(height[i] <= height[j]){
                while(i<j && height[i]<=lower){
                    i++;
                }
            }else{
                while(i<j && height[j]<=lower){
                    j--;
                }
            }
        }

        return result;
    }

    /**
     * 双指针(对撞指针) + 贪心
     * @param height
     * @return
     */
    private int solution2(int[] height){
        int n = height.length;
        if(n < 2){
            return 0;
        }

        int result = 0;
        int water;
        int lower;
        // 双指针(对撞指针)
        int i=0,j=n-1;
        while(i < j){
            lower = Math.min(height[i],height[j]);
            water = lower*(j-i);
            result = Math.max(result, water);
            // 贪心
            if(height[i] <= height[j]){
                i++;
            }else{
                j--;
            }
        }

        return result;
    }
}